﻿#define _CRT_SECURE_NO_WARNINGS 1
//#include<iostream>
//using namespace std;

//拷⻉构造函数
//class Date
//{
//public:
//	Date(int year = 1, int month = 1, int day = 1)
//	{
//		_year = year;
//		_month = month;
//		_day = day;
//	}
//
//	//拷贝构造函数
//	//对于内置类型会进行浅拷贝，对自定义类型会去调用它的拷贝构造函数
//	Date(const Date& d)
//	{
//		_year = d._year;
//		_month = d._month;
//		_day = d._day;
//	}
//
//private:
//	int _year;
//	int _month;
//	int _day;
//};
//
//int main()
//{
//	Date d1(2025, 5, 23);
//	//拷贝构造，一个已经存在的对象去初始化一个实例化的对象
//	Date d2(d1);
//	//拷贝构造也可以写成这样
//	Date d3 = d1;
//
//	//赋值拷贝，两个已经存在的对象，进行拷贝
//	//d1 = d2;
//
//	return 0;
//}

//深拷贝问题
//class Stack
//{
//public:
//	Stack(int n = 4)
//	{
//		_a = (int*)malloc(sizeof(int) * n);
//		if (_a == NULL)
//		{
//			perror("malloc1: ");
//			exit(-1);
//		}
//
//		_top = 0;
//		_capacity = n;
//	}
//
//	Stack(const Stack& s)
//	{
//		_a = (int*)malloc(sizeof(int) * s._capacity);
//		if (_a == NULL)
//		{
//			perror("malloc2: ");
//			exit(-1);
//		}
//
//		memcpy(_a, s._a, sizeof(int) * s._capacity);
//		_top = s._top;
//		_capacity = s._capacity;
//	}
//
//	void Push(int x)
//	{
//		//扩容
//		_a[_top++] = x;
//	}
//
//	~Stack()
//	{
//		cout << "~Stack()" << endl;
//		free(_a);
//		_a = nullptr;
//		_top = 0;
//		_capacity = 0;
//	}
//
//private:
//	int* _a;
//	int _top;
//	int _capacity;
//};
//
//int main()
//{
//	Stack s1;
//
//	s1.Push(1);
//	s1.Push(2);
//	s1.Push(3);
//	s1.Push(4);
//
//	//err - 崩溃原因就是对同一个空间释放了两次
//	//解决方法，显示写拷贝构造函数，进行处理
//	Stack s2(s1);
//
//	return 0;
//}

//赋值运算符重载
//class Date
//{
//public:
//	Date(int year = 1, int month = 1, int day = 1)
//	{
//		_year = year;
//		_month = month;
//		_day = day;
//	}
//
//	//拷贝构造函数
//	Date(const Date& d)
//	{
//		_year = d._year;
//		_month = d._month;
//		_day = d._day;
//	}
//
//	//赋值运算符重载
//	//不写编译器会默认生成一个，这个默认生成的赋值运算符重载对内置类型进行浅拷贝，
//	// 对自定义类型会去调用它的赋值运算符重载
//	//赋值运算符重载，和拷贝构造一样会存在深浅拷贝问题
//	Date& operator=(Date d)
//	{
//		_year = d._year;
//		_month = d._month;
//		_day = d._day;
//
//		return *this;
//	}
//
//	void Print()
//	{
//		cout << _year << "/" << _month << "/" << _day << endl;
//	}
//
//private:
//	int _year;
//	int _month;
//	int _day;
//};


//int main()
//{
//	Date d1(2025, 5, 23);
//	Date d2;
//	Date d3;
//
//	d3 = d2 = d1;
//
//	d1.Print();
//	d2.Print();
//	d3.Print();
//
//	return 0;
//}

#include "Date.h"

void TestDate1()
{
	Date d1(2025, 5, 23);
	Date d2 = d1 + 100;
	d1.Print();
	d2.Print();

	Date d3 = d1 += 100;
	d1.Print();
	d3.Print();
	
}

void TestDate2()
{
	Date d1(2025, 5, 23);
	Date d2 = d1 - 100;
	d1.Print();
	d2.Print();

	Date d3 = d1 -= 100;
	d1.Print();
	d3.Print();

}

void TestDate3()
{
	Date d1(2025, 5, 23);
	Date d2(d1);
	Date d3 = ++d1;

	Date d4 = d2++;
}

void TestDate4()
{
	Date d1(2025, 5, 23);
	Date d2(d1);
	int ret = d1 == d2;
	cout << ret << endl;
}

void TestDate5()
{
	Date d1(2025, 5, 23);
	Date d2(d1);
	int ret = d1 > d2;
	cout << ret << endl;
}

void TestDate6()
{
	Date d1(2025, 5, 23);

	//d1.operator<<(cout);
	////这样写就不便观看,所以写<<运算符的函数重载时得写类外面
	//d1 << cout;

	cout << d1 << endl;

	Date d2;
	cin >> d2;
	cout << d2 << endl;
}

void TestDate7()
{
	Date d1(2025, 5, 23);
	Date d2(2025, 7, 1);
	cout << d1-d2 << endl;

}

void TestDate8()
{
	Date d1(2025, 5, 23);
	Date d2(2025, 5, 231);
	Date d3(2025, 5, 23);
	d1 -= -100;
	d3 += -100;
	cout << d1 << endl;
	cout << d3 << endl;
	cout << d2 << endl;
}

//const成员函数
void Test1()
{
	Date d1(2025, 5, 23);
	const Date d2(2025, 5, 23);

	Date d3 = d1 + 100;
	Date d4 = d2 + 100;//err, 这里涉及到权限的放大，所以得为operator+(int day)加速
}

//取地址运算符重载
namespace xhy
{
	class Date
	{
	public:
		Date(int year = 1, int month = 1, int day = 1)
		{
			_year = year;
			_month = month;
			_day = day;
		}

		//取地址运算符重载
		//作用是用于不想让别人看到这个类的地址，从而重载&运算符
		Date* operator&()
		{
			//return this;
			return nullptr;

		}

		const Date* operator&() const
		{
			//return this;
			return nullptr;
		}

	private:
		int _year;
		int _month;
		int _day;
	};
}


int main()
{
	//TestDate1();
	//TestDate2();
	//TestDate3();
	//TestDate4();
	//TestDate5();
	//TestDate6();
	//TestDate7();
	//TestDate8();
	
	//Test1();

	return 0;
}